package dominioAeropuerto;

import java.util.ArrayList;
import java.util.List;

import api.ObjetoDominio;
import api.Respuesta;
import api.Suceso;

public class ObjetoAvion extends ObjetoDominio implements Mensajes {
	
	public ObjetoAvion(Avion elementoDominio,boolean observaCancelables) {
		super(elementoDominio);
		this.crearSucesoYRespuestas();
	}
	
	private void crearSucesoYRespuestas(){
		Avion avion = (Avion)this.getElementoDominio();
		Suceso sucPistaLibre = new Suceso(pistaLibre);
		Suceso sucAvionEnTierraAv1 = new Suceso(avionEnTierra+"_"+avion.getMatricula());
		Suceso sucAvionEnVueloAv1 = new Suceso(avionEnVuelo+"_"+avion.getMatricula());
		Suceso sucAvionSolicitudDespegueAv1 = new Suceso(solicitudDespegue+"_"+avion.getMatricula());
		Suceso sucAvionSolicitudAterrizajeAv1 = new Suceso(solicitudAterrizaje+"_"+avion.getMatricula());
		
		// Declaro las respuestas
		List<Suceso> sucsAutorizacionDespegue = new ArrayList<Suceso>();
		sucsAutorizacionDespegue.add(sucAvionEnTierraAv1);
		sucsAutorizacionDespegue.add(sucPistaLibre);
		sucsAutorizacionDespegue.add(sucAvionSolicitudDespegueAv1);
		Respuesta respDespegueAutorizado = new Respuesta(respAutorizadoDespegue+"_"+avion.getMatricula(),sucsAutorizacionDespegue,true,true,false);
		this.agregarRespuesta(respDespegueAutorizado);
		
		List<Suceso> sucsAutorizacionAterrizaje = new ArrayList<Suceso>();
		sucsAutorizacionAterrizaje.add(sucAvionEnVueloAv1);
		sucsAutorizacionAterrizaje.add(sucPistaLibre);
		sucsAutorizacionAterrizaje.add(sucAvionSolicitudAterrizajeAv1);
		Respuesta respAterrizajeAutorizado = new Respuesta(respAutorizadoAterrizaje+"_"+avion.getMatricula(),sucsAutorizacionAterrizaje,false,true,false);
		this.agregarRespuesta(respAterrizajeAutorizado);
	}
	
	public void notificarMensaje(String mensaje) {		
		Avion elemento = (Avion)super.getElementoDominio();
		List<Suceso> sucCancelados = new ArrayList<Suceso>();
		if (mensaje.compareTo(avionEnTierra) == 0){
			String mensajeCancelado = avionAterrizando + "_" + elemento.getMatricula();
			Suceso sucesoCancelado = new Suceso(mensajeCancelado);
			sucCancelados.add(sucesoCancelado);
		}
		else if (mensaje.compareTo(avionDespegando) == 0){
			String mensajeCancelado = avionEnTierra + "_" + elemento.getMatricula();
			Suceso sucesoCancelado = new Suceso(mensajeCancelado);
			sucCancelados.add(sucesoCancelado);
			mensajeCancelado = solicitudDespegue + "_" + elemento.getMatricula();
			sucesoCancelado = new Suceso(mensajeCancelado);
			sucCancelados.add(sucesoCancelado);
		}
		else if (mensaje.compareTo(avionEnVuelo) == 0){
			String mensajeCancelado = avionDespegando + "_" + elemento.getMatricula();
			Suceso sucesoCancelado = new Suceso(mensajeCancelado);
			sucCancelados.add(sucesoCancelado);
		}
		else if (mensaje.compareTo(avionAterrizando) == 0){
			String mensajeCancelado = avionEnVuelo + "_" + elemento.getMatricula();
			Suceso sucesoCancelado = new Suceso(mensajeCancelado);
			sucCancelados.add(sucesoCancelado);
			mensajeCancelado = solicitudAterrizaje + "_" + elemento.getMatricula();
			sucesoCancelado = new Suceso(mensajeCancelado);
			sucCancelados.add(sucesoCancelado);
		}
		String mensajeAvion = mensaje + "_" + elemento.getMatricula();
		Suceso suceso = new Suceso(mensajeAvion,sucCancelados);		
		enviarSuceso(suceso);		
	}
	
	public void interpretarRespuesta(Respuesta respuesta){		
		Avion elemento = (Avion)super.getElementoDominio();
		String[] camposRespuesta = respuesta.getDescripcion().split("_");		
		if ((camposRespuesta.length > 1) && (camposRespuesta[1].compareTo(elemento.getMatricula()) == 0)) {			
			if (camposRespuesta[0].compareTo(respAutorizadoDespegue) == 0) elemento.setEstado(avionDespegando);
			else if (camposRespuesta[0].compareTo(respAutorizadoAterrizaje) == 0) elemento.setEstado(avionAterrizando);
			else if (camposRespuesta[0].compareTo(respDespegueCancelado) == 0) elemento.setEstado(avionEnTierra);
			else if (camposRespuesta[0].compareTo(respAterrizajeCancelado) == 0) elemento.setEstado(avionEnVuelo);
		}
	}	
}
